#ifndef _TOKEN_H
#define _TOKEN_H

#include <iostream>
#include <list>

enum TokenType {
    INTEGER_NUMBER, FLOAT_NUMBER, // There may be many other types... 
    IDENTIFIER,
    MINUS, PLUS, 
    DIV, MUL,
    POW,
    BRACKET_OPEN, BRACKET_CLOSE,
    DEF_KEYWORD,
    END_OF_COMMAND
};

struct Token {
    enum TokenType type;
    std::string lexeme;
};

std::ostream & operator<< (std::ostream &oss, const Token &token);

typedef std::list<Token> TokenStream;
typedef std::list<Token>::iterator TokenStreamIter;
typedef std::list<Token>::const_iterator TokenStreamConstIter;

#endif // _TOKEN_H